package info.motteke.qjdbc.dto;

import info.motteke.qjdbc.column.Meta;
import info.motteke.qjdbc.column.variable.Variable;
import info.motteke.qjdbc.db.Database;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Set;

/**
 * DTOのメタ情報を表すクラスです。
 *
 * @author YWak
 *
 * @param <T>
 */
public abstract class DtoMeta<T> {

    /**
     * DTOのクラスです。
     */
    protected final Class<T> baseClass;

    /**
     * DBアクセス時のテーブル名です。
     */
    protected final String tableName;

    /**
     * テーブルが存在するデータベースです。
     */
    protected final Database database;

    protected DtoMeta(Class<T> clazz, String tableName, Database database) {
        this.baseClass = clazz;
        this.tableName = tableName;
        this.database = database;
    }

    final Database getDatabase() {
        return database;
    }

    final String getTableName() {
        return tableName;
    }

    final T newInstance() {
        return newInstanceImpl();
    }

    protected abstract T newInstanceImpl();

    final void setValues(ResultSet rs, T obj, Set<Meta> columns) throws SQLException {
        setValuesImpl(rs, obj, columns);
    }

    protected abstract void setValuesImpl(ResultSet rs, T obj, Set<Meta> columns)
            throws SQLException;

    final void putValues(T obj, List<Pair> variables) throws SQLException {
        putValuesImpl(obj, variables);
    }

    protected abstract void putValuesImpl(T obj, List<Pair> variables) throws SQLException;

    public static class Pair {
        private final Variable variable;

        private final Meta column;

        public Pair(Variable variable, Meta column) {
            this.variable = variable;
            this.column = column;
        }

        public Variable getVariable() {
            return variable;
        }

        public Meta getColumn() {
            return column;
        }
    }
}
